/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.sadhar.sipp.penyusunananggaranpendapatansewabungadll;

import java.util.Map;
import org.sadhar.errhandler.ClassAntiNull;
import org.sadhar.sia.common.ClassSession;
import org.sadhar.sia.framework.ClassApplicationModule;
import org.sadhar.sipp.pospendapatan.PosPendapatan;
import org.sadhar.sipp.pospendapatan.PosPendapatanDAO;
import org.sadhar.sipp.pospendapatan.PosPendapatanDAOImpl;
import org.sadhar.sipp.unkerja.UnKerja;
import org.sadhar.sipp.unkerja.UnKerjaDAO;
import org.sadhar.sipp.unkerja.UnKerjaDAOImpl;
import org.zkoss.zk.ui.Session;
import org.zkoss.zk.ui.Sessions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zul.Button;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Doublebox;
import org.zkoss.zul.Label;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Listcell;
import org.zkoss.zul.Listitem;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Space;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Toolbarbutton;

/**
 *
 * @author hendro
 */
public class PenyusunanAnggaranPendapatanSewaBungaWnd extends ClassApplicationModule {

    private Label lblTahunAnggaran;
    private Combobox cmbboxPosPendapatan;
    private Listbox lstboxUnitKerja;
    private Label lblUnitKerja;
    private Label lblRealisasi;
    private Doublebox txtboxProsentase;
    private Label lblTotalAnggaran;
    private Button btnSimpan;
    private Button btnBatal;
    private Listbox lstboxAnggaranPendapatan;
    private ClassSession session;
    private Textbox txtboxIdPosPendapatan;
    private Textbox textboxIdPosAnggaranPendapatanUnit;
    private Textbox txtboxRealisasi;
    private PosPendapatanDAO posPendapatanDAO;
    private UnKerjaDAO unKerjaDAO;
    private PenyusunanAnggaranPendapatanSewaBungaDAO anggaranDAO;
    private Session sesi;

    public PenyusunanAnggaranPendapatanSewaBungaWnd() {
        this.posPendapatanDAO = new PosPendapatanDAOImpl();
        this.unKerjaDAO = new UnKerjaDAOImpl();
        this.anggaranDAO = new PenyusunanAnggaranPendapatanSewaBungaDAOImpl();
        sesi = Sessions.getCurrent();
        session = (ClassSession) sesi.getAttribute("CURRENT_SESSION");
    }

    public void onCreate() throws Exception {
        lblTahunAnggaran = (Label) getFellow("lblTahunAnggaran");
        cmbboxPosPendapatan = (Combobox) getFellow("cmbboxPosPendapatan");
        lstboxUnitKerja = (Listbox) getFellow("lstboxUnitKerja");
        lblUnitKerja = (Label) getFellow("lblUnitKerja");
        lblRealisasi = (Label) getFellow("lblRealisasi");
        txtboxProsentase = (Doublebox) getFellow("txtboxProsentase");
        lblTotalAnggaran = (Label) getFellow("lblTotalAnggaran");
        btnSimpan = (Button) getFellow("btnSimpan");
        btnBatal = (Button) getFellow("btnBatal");
        lstboxAnggaranPendapatan = (Listbox) getFellow("lstboxAnggaranPendapatan");
        txtboxIdPosPendapatan = (Textbox) getFellow("txtboxIdPosPendapatan");
        txtboxRealisasi = (Textbox) getFellow("txtboxRealisasi");
        textboxIdPosAnggaranPendapatanUnit = (Textbox) getFellow("textboxIdPosAnggaranPendapatanUnit");
        lblTahunAnggaran.setValue(session.getThnAnggaran());
        loadPosPendapatan();
        loadAnggaranPendapatan();
    }

    public void loadPosPendapatan() throws Exception {
        cmbboxPosPendapatan.getItems().clear();
        for (PosPendapatan pos : posPendapatanDAO.list()) {
            Comboitem item = new Comboitem();
            item.setValue(pos);
            item.setLabel(pos.getNamaPosPendapatan());
            cmbboxPosPendapatan.appendChild(item);
        }
    }

    public void cmbboxPosPendapatanOnSelect() throws Exception {
        PosPendapatan pos = (PosPendapatan) cmbboxPosPendapatan.getSelectedItem().getValue();
        txtboxIdPosPendapatan.setValue(pos.getIdPosPendapatan() + "");
        loadListboxUnitKerja(pos.getIdPosPendapatan());
    }

    private void loadListboxUnitKerja(int idPosPendapatan) throws Exception {
        lstboxUnitKerja.getItems().clear();
        int x = 0;
        for (UnKerja unKerja : unKerjaDAO.list(idPosPendapatan, session.getThnAnggaran())) {
            Listitem item = new Listitem();
            item.setValue(unKerja);
            item.appendChild(new Listcell(unKerja.getNamaUnitKerja()));

            Checkbox chk = new Checkbox();
            chk.setId(String.valueOf(x++));
            chk.setChecked(true);
            chk.setDisabled(true);
            Listcell cell = new Listcell();
            cell.appendChild(chk);

            item.appendChild(cell);
            lstboxUnitKerja.appendChild(item);
        }
    }

    public void lstboxUnitKerjaOnSelect() throws Exception {
        if (txtboxIdPosPendapatan.getValue().isEmpty()) {
            Messagebox.show("Silahkan memilih Pos Pendapatan", "Informasi", Messagebox.YES, Messagebox.INFORMATION);
            return;
        } else {
            UnKerja unKerja = (UnKerja) lstboxUnitKerja.getSelectedItem().getValue();
            lblUnitKerja.setValue(unKerja.getNamaUnitKerja());
            textboxIdPosAnggaranPendapatanUnit.setValue(unKerja.getIdPosAnggaranPendapatanUnit() + "");
            if (Integer.valueOf(txtboxIdPosPendapatan.getValue()) == 10 || Integer.valueOf(txtboxIdPosPendapatan.getValue()) == 14) {
                String kodeProdi = unKerja.getKdUnitKerja().substring(3, 7);
                String dbName = "db_" + kodeProdi;
                String tblName1 = "tg" + kodeProdi + String.valueOf(Integer.valueOf(session.getThnAnggaran()) - 1) + "1";
                String tblName2 = "tg" + kodeProdi + String.valueOf(Integer.valueOf(session.getThnAnggaran()) - 2) + "2";
                String tblName3 = "tg" + kodeProdi + String.valueOf(Integer.valueOf(session.getThnAnggaran()) - 2) + "3";
                String kodeTagih="";
                if(Integer.valueOf(txtboxIdPosPendapatan.getValue()) == 10){
                    kodeTagih = "0600";
                }else{
                    kodeTagih = "0403";
                }
                double temp1 = anggaranDAO.getAnggaran(dbName, tblName1, session.getThnAnggaran(),kodeTagih);
                double temp2 = anggaranDAO.getAnggaran(dbName, tblName2, session.getThnAnggaran(),kodeTagih);
                double temp3 = anggaranDAO.getAnggaran(dbName, tblName3, session.getThnAnggaran(),kodeTagih);
                double anggaran = temp1 + temp2 + temp3;
                lblRealisasi.setValue(ClassAntiNull.AntiNullDoubleString(anggaran));
                txtboxRealisasi.setValue(anggaran + "");
            } else {
                double anggaran = anggaranDAO.loadRealisasi(Integer.valueOf(txtboxIdPosPendapatan.getValue()),
                        unKerja.getKdUnitKerja(),
                        String.valueOf(Integer.valueOf(session.getThnAnggaran()) - 1));
                lblRealisasi.setValue(ClassAntiNull.AntiNullDoubleString(anggaran));
                txtboxRealisasi.setValue(anggaran + "");
            }
        }
    }

    public void txtboxProsentaseOnChange() throws Exception {
        double prosentase = Double.valueOf(txtboxProsentase.getValue()) / 100;
        double anggaran = ClassAntiNull.AntiNullDouble(txtboxRealisasi.getValue());
        double total = anggaran * prosentase;
        lblTotalAnggaran.setValue(ClassAntiNull.AntiNullDoubleString(total));
    }
    private boolean isEdit;

    public void btnSimpanOnClick() throws Exception {
        if (textboxIdPosAnggaranPendapatanUnit.getValue().isEmpty()) {
            Messagebox.show("Silahkan memilih Pos Pendapatan", "Informasi", Messagebox.YES, Messagebox.INFORMATION);
            return;
        }
        if (txtboxProsentase.getValue() < 0) {
            Messagebox.show("Silahkan input Prosentase", "Informasi", Messagebox.YES, Messagebox.INFORMATION);
            return;
        }
        if (lblRealisasi.getValue().isEmpty()) {
            Messagebox.show("Silahkan memilih Unit Kerja", "Informasi", Messagebox.YES, Messagebox.INFORMATION);
            return;
        }
        try {
            if (anggaranDAO.select(Integer.valueOf(textboxIdPosAnggaranPendapatanUnit.getValue())) == null) {
                anggaranDAO.insert(Integer.valueOf(textboxIdPosAnggaranPendapatanUnit.getValue()), Double.valueOf(txtboxProsentase.getValue()),
                        Double.valueOf(txtboxRealisasi.getValue()));
                loadAnggaranPendapatan();
                clearComponen();
                Messagebox.show("Data Tersimpan", "Informasi", Messagebox.YES, Messagebox.INFORMATION);
            } else {
                if (isEdit) {
                    anggaranDAO.update(Integer.valueOf(textboxIdPosAnggaranPendapatanUnit.getValue()), Double.valueOf(txtboxProsentase.getValue()),
                            Double.valueOf(txtboxRealisasi.getValue()));
                    loadAnggaranPendapatan();
                    clearComponen();
                    Messagebox.show("Data Tersimpan", "Informasi", Messagebox.YES, Messagebox.INFORMATION);
                    isEdit = false;
                } else {
                    if (Messagebox.show("Data sudah ada, apakah akan ditimpa?", "Pesan Konfirmasi", Messagebox.YES | Messagebox.NO, Messagebox.QUESTION) == Messagebox.YES) {
                        anggaranDAO.update(Integer.valueOf(textboxIdPosAnggaranPendapatanUnit.getValue()), Double.valueOf(txtboxProsentase.getValue()),
                                Double.valueOf(txtboxRealisasi.getValue()));
                        loadAnggaranPendapatan();
                        clearComponen();
                        Messagebox.show("Data Tersimpan", "Informasi", Messagebox.YES, Messagebox.INFORMATION);
                    } else {
                        return;
                    }
                }
            }
        } catch (Exception ex) {
            Messagebox.show("Data gagal disimpan " + ex.getMessage(), "Informasi Kesalahan", Messagebox.YES, Messagebox.ERROR);
            return;
        }
    }

    private void clearComponen() throws Exception {
        lblUnitKerja.setValue(".......................");
        lblRealisasi.setValue(".......................");
        txtboxProsentase.setValue(0);
        lblTotalAnggaran.setValue(".......................");
        txtboxRealisasi.setValue("");
        txtboxProsentase.setDisabled(false);
    }

    public void btnBatalOnClick() throws Exception {
        clearComponen();
        lstboxUnitKerja.getItems().clear();
    }

    private void loadAnggaranPendapatan() throws Exception {
        lstboxAnggaranPendapatan.getItems().clear();
        int id = 1;
        for (final Map m : anggaranDAO.listAnggaranPendapatan(session.getThnAnggaran())) {
            Listitem item = new Listitem();
            item.setValue(m);
            item.appendChild(new Listcell(m.get("posPendapatan").toString()));
            item.appendChild(new Listcell(m.get("Nama_unit_kerja").toString()));
            item.appendChild(new Listcell(ClassAntiNull.AntiNullDoubleCurrency(m.get("realisasiTahunSebelumnya"))));
            item.appendChild(new Listcell(ClassAntiNull.AntiNullDoubleString(m.get("prosentase"))));
            item.appendChild(new Listcell(ClassAntiNull.AntiNullDoubleCurrency(m.get("jumlahAnggaran"))));
            Listcell cellAksi = new Listcell();
            Toolbarbutton btnUbah = new Toolbarbutton();
            btnUbah.setId("btnUbah" + String.valueOf(id));
            btnUbah.setLabel("[ubah]");
            btnUbah.addEventListener("onClick", new EventListener() {

                public void onEvent(Event arg0) throws Exception {
                    textboxIdPosAnggaranPendapatanUnit.setValue(m.get("idPosAnggaranPendapatanUnit").toString());
                    lblUnitKerja.setValue(m.get("Nama_unit_kerja").toString());
                    lblRealisasi.setValue(ClassAntiNull.AntiNullDoubleString(m.get("realisasiTahunSebelumnya")));
                    txtboxRealisasi.setValue(m.get("realisasiTahunSebelumnya").toString());
                    txtboxProsentase.setValue(Double.valueOf(m.get("prosentase").toString()));
                    lblTotalAnggaran.setValue(ClassAntiNull.AntiNullDoubleCurrency(m.get("jumlahAnggaran")));
                    txtboxProsentase.setDisabled(false);
                    isEdit = true;
                }
            });
            Toolbarbutton btnHapus = new Toolbarbutton();
            btnHapus.setId("btnHapus" + String.valueOf(id));
            btnHapus.setLabel("[hapus]");
            btnHapus.addEventListener("onClick", new EventListener() {

                public void onEvent(Event arg0) throws Exception {
                    if (Messagebox.show("Data akan dihapus?", "Pesan Konfirmasi", Messagebox.YES | Messagebox.NO, Messagebox.QUESTION) == Messagebox.YES) {
                        anggaranDAO.delete(Integer.valueOf(m.get("idPosAnggaranPendapatanUnit").toString()));
                        loadAnggaranPendapatan();
                        clearComponen();
                        Messagebox.show("Data Terhapus", "Informasi", Messagebox.YES, Messagebox.INFORMATION);
                    }
                }
            });
            id++;
            cellAksi.appendChild(btnUbah);
            cellAksi.appendChild(new Space());
            cellAksi.appendChild(btnHapus);
            item.appendChild(cellAksi);
            lstboxAnggaranPendapatan.appendChild(item);
        }
    }

    public void lstboxAnggaranPendapatanOnSelect() throws Exception {
        Map m = (Map) lstboxAnggaranPendapatan.getSelectedItem().getValue();
        textboxIdPosAnggaranPendapatanUnit.setValue(m.get("idPosAnggaranPendapatanUnit").toString());
        lblUnitKerja.setValue(m.get("Nama_unit_kerja").toString());
        lblRealisasi.setValue(ClassAntiNull.AntiNullDoubleString(m.get("realisasiTahunSebelumnya")));
        txtboxProsentase.setValue(Double.valueOf(m.get("prosentase").toString()));
        lblTotalAnggaran.setValue(ClassAntiNull.AntiNullDoubleCurrency(m.get("jumlahAnggaran")));
        txtboxProsentase.setDisabled(true);
    }
}
